package leetcode.editor.cn.q1_300.q150;

import java.util.HashMap;
import java.util.Map;

/**
 * 我摊牌了。。太麻烦了，抄的答案
 *
 * @author qidi
 * @date 2022-02-10 09:07:58
 */
class Q0166_FractionToRecurringDecimal {

    //leetcode submit region begin(Prohibit modification and deletion)
    class Solution {
        public String fractionToDecimal(int numerator, int denominator) {
            long numeratorLong = (long) numerator;
            long denominatorLong = (long) denominator;
            if (numeratorLong % denominatorLong == 0) {
                return String.valueOf(numeratorLong / denominatorLong);
            }

            StringBuffer sb = new StringBuffer();
            if (numeratorLong < 0 ^ denominatorLong < 0) {
                sb.append('-');
            }

            // 整数部分
            numeratorLong = Math.abs(numeratorLong);
            denominatorLong = Math.abs(denominatorLong);
            long integerPart = numeratorLong / denominatorLong;
            sb.append(integerPart);
            sb.append('.');

            // 小数部分
            StringBuffer fractionPart = new StringBuffer();
            Map<Long, Integer> remainderIndexMap = new HashMap<Long, Integer>();
            long remainder = numeratorLong % denominatorLong;
            int index = 0;
            while (remainder != 0 && !remainderIndexMap.containsKey(remainder)) {
                remainderIndexMap.put(remainder, index);
                remainder *= 10;
                fractionPart.append(remainder / denominatorLong);
                remainder %= denominatorLong;
                index++;
            }
            if (remainder != 0) { // 有循环节
                int insertIndex = remainderIndexMap.get(remainder);
                fractionPart.insert(insertIndex, '(');
                fractionPart.append(')');
            }
            sb.append(fractionPart.toString());

            return sb.toString();
        }
    }
    //leetcode submit region end(Prohibit modification and deletion)


    public static void main(String[] args) {
        Solution solution = new Q0166_FractionToRecurringDecimal().new Solution();
        System.out.println(solution.fractionToDecimal(500, 10));
        System.out.println(solution.fractionToDecimal(1, 17));
        System.out.println(solution.fractionToDecimal(1, 90));
        System.out.println(solution.fractionToDecimal(1, 70));
        System.out.println(solution.fractionToDecimal(1, 8));
        System.out.println(solution.fractionToDecimal(12, 7));
        System.out.println(solution.fractionToDecimal(1, 4));
        System.out.println(solution.fractionToDecimal(1, 6));
        System.out.println(solution.fractionToDecimal(1, 7));
        System.out.println(solution.fractionToDecimal(1, 8));
        System.out.println(solution.fractionToDecimal(1, 9));
        System.out.println(solution.fractionToDecimal(4, 333));
        System.out.println(solution.fractionToDecimal(2, 3));
        System.out.println(solution.fractionToDecimal(4, 3));
        System.out.println(solution.fractionToDecimal(1, 5));
        System.out.println(solution.fractionToDecimal(1, 2));
        System.out.println(solution.fractionToDecimal(2, 1));
    }
}